前言

GAN,VAE和FLOW的目标是一致的——希望构建一个从隐变量ZZ生成目标数据XX的模型,其中先验分布P(z)P(z)通常被设置为高斯分布。我们希望找到一个变换函数f(x)f(x),他能建立一个从zzxx的映射:f:zxf:z\to x,然后在P(Z)P(Z)中随机采样一个点zz',通过映射ff,就可以找到一个新的样本点xx'

image.png

举个栗子:

如何将均匀分布U[0,1]U[0,1]映射成正态分布N(0,1)N(0,1)

XU[0,1]X \sim U[0,1]经过函数Y=f(x)Y = f(x)映射之后,就有YN(0,1)Y\sim N(0,1)了那么[x,x+dx][x,x+dx][y,y+dy][y,y+dy]两个区间上的概率应该相等,即:

ρ(x)dx=12πexp(y22)dy\rho(x) d x=\frac{1}{\sqrt{2 \pi}} \exp \left(-\frac{y^{2}}{2}\right) d y

对其进行积分,有:

0xρ(t)dt=y12πexp(t22)dt=Φ(y)\int_{0}^{x} \rho(t) d t=\int_{-\infty}^{y} \frac{1}{\sqrt{2 \pi}} \exp \left(-\frac{t^{2}}{2}\right) d t=\Phi(y)

y=Φ1(0xρ(t)dt)=f(x)y=\Phi^{-1}\left(\int_{0}^{x} \rho(t) d t\right)=f(x)

可以看到Y=f(X)Y = f(X)的解是存在的,但很复杂,无法用初等函数进行显示的表示,因此在大多数情况下,我们都是通过神经网络来拟合这个函数。

假设我们现在已经有一个映射ff,我们如何衡量映射ff构造出来的数据集f(z1),f(z2),...,f(zn)f(z_1),f(z_2),...,f(z_n),是否和目标数据XX分布相同?(注:KL和JS距离根据两个概率分布的表达式计算分布的相似度,而我们现在只有从构造的分布采样的数据和真实分布采样的数据,而离散化的KL和JS距离因为图像维度问题,计算量非常大)。在这里GAN采用了一个暴力的办法:训练一个判别器作为两者相似性的度量,而VAE(变分自编码器)和FLOW(流模型)在最大化最大似然。

VAE(变分自编码器)

VAE的基本思路

对于连续随机变量,概率分布PPQQ,KL散度(又称相对熵)的定义为:

DKL(PQ)=p(x)lnp(x)q(x)dx=ExP(x)[logP(x)logQ(x)]D_{\mathrm{KL}}(P \| Q)=\int_{-\infty}^{\infty} p(x) \ln \frac{p(x)}{q(x)} \mathrm{d} x=E_{x \sim P(x)}[logP(x)-logQ(x)]

给定一个概率分布DD,已知其概率密度函数(连续分布)或概率质量函数(离散分布)为fDf_D,以及一个分布参数θ\theta,我们可以从这个分布中抽出一个具有nn个值的采样X1,X2,...,XnX_1,X_2,...,X_n,利用fDf_D计算出其似然函数:

L(θx1,,xn)=fθ(x1,,xn)\mathbf{L}\left(\theta | x_{1}, \ldots, x_{n}\right)=f_{\theta}\left(x_{1}, \ldots, x_{n}\right)

DD是离散分布,fθf_{\theta}即是在参数为θ\theta时观测到这一采样的概率。若其是连续分布,fθf_{\theta}则为X1,X2,...,XnX_1,X_2,...,X_n联合分布的概率密度函数在观测值处的取值。一旦我们获得X1,X2,...,XnX_1,X_2,...,X_n,我们就能求得一个关于θ\theta的估计。最大似然估计会寻找关于的最可能的值(即,在所有可能的取值中,寻找一个值使这个采样的“可能性”最大化)。从数学上来说,我们可以在的所有可能取值中寻找一个值使得似然函数取到最大值。这个使可能性最大的值即称为的最大似然估计。由定义,最大似然估计是样本的函数。

注:下面忽略积分号和求和的差异

VAE做最大似然估计,也就是要最大化概率:

P(X)=iP(Xzi;θ)P(zi)P(X)=\sum_{i} P\left(X | z_{i} ; \theta\right) P\left(z_{i}\right)

一般选择P(Z)P(Z)服从一个高斯分布,而p(Xz)p(X|z)可以是任意分布,例如条件高斯分布或狄拉克分布,理论上讲,这个积分形式的分布可以拟合任意分布。

实际上,最大似然估计与最小化两个分布之间的KL距离是等价的:

argminKL(p(x)q(x))=argminp(x)logp(x)q(x)dx=argmaxp(x)q(x)dx=argmaxExp(x)q(x)\begin{aligned} argmin{KL(p(x)\|q(x))} &= argmin \int p(x)log \frac{p(x)}{q(x)}dx \\ &= argmax \int p(x)q(x)dx \\ &=argmaxE_{x \sim p(x)}q(x) \end{aligned}

但是这里的P(X)P(X)是积分形式的,很难进行计算。VAE从让人望而生畏的变分和贝叶斯理论出发,推导出了一个很接地气的公式:

logP(X)D[Q(zX)P(zX)]=EzQ[logP(Xz)]D[Q(zX)P(z)](1)\log P(X)-\mathcal{D}[Q(z | X) \| P(z | X)]=E_{z \sim Q}[\log P(X | z)]-\mathcal{D}[Q(z | X) \| P(z)] \tag{1}

VAE并没有选择直接去优化P(X)P(X),而是选择去优化他的一个变分下界(公式1右端)。

而VAE的自编码器性质也从这个公式里开始体现出来:我们可以将D[Q(zX)P(z)]\mathcal{D}[Q(z | X) \| P(z)]视作编码器的优化,使由真实数据编码出的隐变量分布Q(zX)Q(z|X)去尽量近似P(z)P(z)(标准高斯分布),而将EzQ[logP(Xz)]E_{z \sim Q}[\log P(X | z)]视作解码器的优化,使得服从分布QQ的隐变量zz解码出的xx尽可能地服从真是数据分布,而将D[Q(zX)P(zX)]\mathcal{D}[Q(z | X) \| P(z | X)]视作误差项。

但VAE也因为它并没有直接去优化P(X)P(X),而选择去优化它的变分下界,使得他只是一个近似模型,无法保证良好的生成效果。

VAE的优化过程

首先要确定概率密度Q(zX)Q(z|X)的形式,一般选择正态分布,即N(μ,σ2)\mathcal{N}\left(\mu, \sigma^{2}\right),其中μ(X;θμ),σ2(X;θσ)\mu\left(X ; \theta_{\mu}\right) , \sigma^{2}\left(X ; \theta_{\sigma}\right)通过两个神经网络(编码器)训练出来。公式中的D[Q(zX)P(z)]\mathcal{D}[Q(z | X) \| P(z)]变为D[N(μ(X;θμ),σ2(X;θσ))N(0,I)]D\left[\mathcal{N}\left(\mu\left(X ; \theta_{\mu}\right), \sigma^{2}\left(X ; \theta_{\sigma}\right)\right) \| \mathcal{N}(0, I)\right],这个时候就可以通过两个正态分布的KL散度的计算公式来计算这一项。

对于第一项EzQ[logP(Xz)]E_{z \sim Q}[\log P(X | z)],对于一个batch来说,可以在QQ中采样,然后将单个样本的logP(Xz)\log P(X|z)求和取平均数作为期望的估计。但这样出现一个问题:把Q(zX)Q(z|X)弄丢了,也就是每次训练的时候梯度不传进QQ里,论文里采用了一个称为重参数化技巧(reparamenterization trick)的方法,如图:

image.png

至此,整个VAE网络就可以训练了。

公式推导部分

D[Q(zX)P(zX)]=EzQ[logQ(zX)logP(zX)]=EzQ[logQ(zX)logP(zX)logP(X)]+logP(X)\begin{aligned} \mathcal{D}[Q(z|X)||P(z|X)] &= E_{z \sim Q}[\log Q(z|X) - \log P(z|X)] \\ &= E_{z \sim Q}[\log Q(z|X) - \log P(z|X) - \log P(X)] + \log P(X) \end{aligned}

移项得

logP(X)D[Q(zX)P(zX)]=EzQ[logP(Xz)]D[Q(zX)P(z)]\log P(X)-\mathcal{D}[Q(z | X) \| P(z | X)]=E_{z \sim Q}[\log P(X | z)]-\mathcal{D}[Q(z | X) \| P(z)]

GAN

模型构建

由于大家都对GAN比较熟悉,本文直接从变分推断的角度去理解GAN。

不同于VAE将P(Xz)P(X|z)选为高斯分布,GAN的选择是:

P(xz)=δ(xG(z)),P(x)=P(xz)P(z)dzP(x | z)=\delta(x-G(z)), \quad P(x)=\int P(x | z) P(z) d z

其中δ(x)\delta (x)是狄拉克函数,G(z)G(z)为生成器网络。

在VAE中z被当作是一个隐变量,但在GAN中,狄拉克函数意味着单点分布,即x和z为一一对应的关系。于是在GAN中z没有被当作隐变量处理(不需要考虑后验分布P(zx)P(z|x))

判别器的理解:

在GAN中引入了一个二元的隐变量y来构成联合分布,其中p~(x)\tilde{p}(x) 为真实样本的分布:

q(x,y)={p~(x)p1,y=1p(x)p0,y=0q(x, y)=\left\{\begin{array}{l} {\tilde{p}(x) p_{1}, y=1} \\ {p(x) p_{0}, y=0} \end{array}\right.

这里y是图像的真实标签,当图片为真实图片时,y=1,当图片是生成图片时,y=0。

其中p0,p1p_0, p_1代表权重,在下面讨论中我们直接取p0=p1=1/2p_0=p_1=1/2

另一方面,我们需要使判别器的判别结果尽可能真实,设p(x,y)=p(yx)p~(x)p(x,y)=p(y|x)\tilde{p}(x)p(yx)p(y|x)为一个条件伯努利分布(判别器的判别结果)。优化目标是KL(q(x,y)p(x,y))KL(q(x,y)||p(x,y))

KL(q(x,y)p(x,y))=p~(x)p1logp~(x)p1p(1x)p~(x)dx+p(x)p0logp(x)p0p(0x)p~(x)dxp~(x)log12p(1x)dx+p(x)logp(x)2p(0x)p~(x)dx=Exp~(x)[log2p(1x)]Exp(x)[log2p(0x)]+KL(p(x)p~(x))\begin{aligned} K L(q(x, y) \| p(x, y)) &=\int \tilde{p}(x) p_{1} \log \frac{\tilde{p}(x) p_{1}}{p(1 | x) \tilde{p}(x)} d x+\int p(x) p_{0} \log \frac{p(x) p_{0}}{p(0 | x) \tilde{p}(x)} d x \\ & \sim \int \tilde{p}(x) \log \frac{1}{2p(1 | x)} d x+\int p(x) \log \frac{p(x)}{2p(0 | x) \tilde{p}(x)} d x\\ & = -E_{x \sim \tilde{p}(x)}[\log 2p(1|x)]-E_{x \sim p(x)}[\log 2p(0|x)]+KL(p(x)||\tilde{p}(x)) \end{aligned}

一旦成功优化,就有q(x,y)p(x,y)q(x,y)\to p(x,y),对于x求边缘概率分布,有:

12p~(x)+12p(x)p(1x)p~(x)+p(0x)p~(x)=p~(x)\frac{1}{2}\tilde{p}(x)+\frac{1}{2}p(x)\to p(1|x)\tilde{p}(x)+p(0|x)\tilde{p}(x)=\tilde{p}(x)

即:

p(x)p~(x)p(x)\to \tilde{p}(x)

这就完成了对模型的构建。

目标优化

现在我们有优化目标:p(1x)p(1|x)G(z)G(z),分别是判别器(p(yx)p(y|x)服从条件伯努利分布,可以直接由p(1x)p(1|x)确定)和生成器(p(x)p(x)G(z)G(z)决定)。类似EM算法,我们进行交替优化:先固定G(z)G(z),这也意味着p(x)p(x)固定了,然后优化p(yx)p(y|x),优化目标为:

D=argminD{Exp~(x)[log2D(x)]Exp(x)[log2(1D(x))]}D=\underset{D}{\arg \min }\{-E_{x \sim \tilde{p}(x)}[\log 2D(x)]-\mathbb{E}_{x \sim p(x)}[\log 2(1-D(x))]\}

当生成器固定时,p(x)p(x) 也固定,分别记p~(x),p(x),D(x)\tilde{p}(x),p(x),D(x)a,b,ta,b,t ,忽略常数项,优化目标变为:

D=argmaxp~(x)logt+p(x)log(1t)dxD=argmax \int \tilde{p}(x)\log t + p(x) \log(1-t)dx

求导算出其理论最优解为t=D(x)=p~(x)p~(x)+p0(x)t=D(x)=\frac{\tilde{p}(x)}{\tilde{p}(x)+p^0(x)}

然后固定D(x)D(x)来优化G(x)G(x),相关loss为:

G=argminGp(x)logp0p(x)(1D(x))p~(x)dxG=\underset{G}{\arg \min } \int p(x) \log \frac{p_0 p(x)}{(1-D(x)) \tilde{p}(x)} d x

假设D(x)D(x)有足够的拟合能力,当D(x)=p~(x)p~(x)+p0(x)D(x)=\frac{\tilde{p}(x)}{\tilde{p}(x)+p^0(x)}时,有

KL(q(x,y)p0(x,y))=p~(x)log12D(x)dx+p0(x)logp0(x)2(1D(x))p~(x)dx=p~(x)logp~(x)+p0(x)2p~(x)+p0(x)logp~(x)+p0(x)2p~(x)=KL(p~(x)+p0(x)2p~(x))\begin{aligned} K L(q(x, y) \| p^0(x, y)) &= \int \tilde{p}(x) \log \frac{1}{2D(x)} d x+\int p^0(x) \log \frac{p^0(x)}{2(1-D(x)) \tilde{p}(x)} d x\\ &= \int\tilde{p}(x) \log \frac{\tilde{p}(x)+p^0(x)}{2\tilde{p}(x)}+p^0(x) \log \frac{\tilde{p}(x)+p^0(x)}{2\tilde{p}(x)}\\ &= KL(\tilde{p}(x) +p^0(x)||2\tilde{p}(x) ) \end{aligned}

在优化判别器时,p0(x)p^0(x)应该为上一阶段生成器优化的p(x)p(x) 。将这个D(x)D(x)代入生成器的相关loss:

G=argminGp(x)logp0p(x)(1D(x))p~(x)dx=argminGp(x)logp(x)2D(x)p0(x)dx=argminG[Exp(x)2D(x)+KL(p(x)p0(x))]=argminG[Exp(x)2D(G(z))+KL(p(x)p0(x))]\begin{aligned} G &= \underset{G}{\arg \min } \int p(x) \log \frac{p_0 p(x)}{(1-D(x)) \tilde{p}(x)} d x\\ &= \underset{G}{\arg \min } \int p(x) \log \frac{ p(x)}{2D(x) p^0(x)} d x\\ &= \underset{G}{\arg \min }[-E_{x \sim p(x)}2D(x)+KL(p(x)||p^0(x))]\\ &= \underset{G}{\arg \min }[-E_{x \sim p(x)}2D(G(z))+KL(p(x)||p^0(x))] \end{aligned}

可以看到,此时的第一项Exp(x)2D(G(z))-E_{x \sim p(x)}2D(G(z))就是标准的GAN所采用的loss之一。而我们知道,目前标准的GAN生成器的loss都不包含KL(p(x)p0(x))KL(p(x)||p^0(x)),这实际上造成了loss的不完备。

第二个loss是在限制要求新的生成器跟旧的生成器生成结果不能差别太大 ,也就是生成器不能剧烈变化。在loss不完备的情况下,假设有一个优化算法总能找到G(z)G(z)的理论最优解、并且G(z)G(z)具有无限的拟合能力,那么G(z)G(z)只需要生成唯一一个使得D(x)D(x)最大的样本(不管输入的zz是什么),这就是模型坍缩。模型塌缩的视频(需要梯子)。

然后对第二项进行估算,得到一个可以在实验中使用的正则项:

po(x)=qθΔθ(x),p(x)=qθ(x)p^{o}(x)=q_{\theta-\Delta \theta}(x), \quad p(x)=q_{\theta}(x),其中Δθ\Delta \theta为生成器的参数变化,对qo(x)=qθΔθ(x)q^{o}(x)=q_{\theta-\Delta \theta}(x)做泰勒展开,有:

qo(x)=qθΔθ(x)=qθ(x)Δθθqθ(x)+O((Δθ)2)q^{o}(x)=q_{\theta-\Delta \theta}(x)=q_{\theta}(x)-\Delta \theta \cdot \nabla_{\theta} q_{\theta}(x)+O\left((\Delta \theta)^{2}\right)

KL(q(x)qo(x))qθ(x)logqθ(x)qθ(x)Δθθqθ(x)dx=qθ(x)log[1Δθθqθ(x)qθ(x)]dxqθ(x)[Δθθqθ(x)qθ(x)(Δθθqθ(x)qθ(x))2]dx=Δθθqθ(x)dx+(Δθ)2(θqθ(x))22qθ(x)dx=(Δθ)2(θqθ(x))22qθ(x)dx(Δθc)2\begin{aligned} K L\left(q(x) \| q^{o}(x)\right) & \approx \int q_{\theta}(x) \log \frac{q_{\theta}(x)}{q_{\theta}(x)-\Delta \theta \cdot \nabla_{\theta} q_{\theta}(x)} d x \\ &=-\int q_{\theta}(x) \log \left[1-\frac{\Delta \theta \cdot \nabla_{\theta} q_{\theta}(x)}{q_{\theta}(x)}\right] d x \\ & \approx-\int q_{\theta}(x)\left[-\frac{\Delta \theta \cdot \nabla_{\theta} q_{\theta}(x)}{q_{\theta}(x)}-\left(\frac{\Delta \theta \cdot \nabla_{\theta} q_{\theta}(x)}{q_{\theta}(x)}\right)^{2}\right] d x \\ &=\Delta \theta \cdot \nabla_{\theta} \int q_{\theta}(x) d x+(\Delta \theta)^{2} \cdot \int \frac{\left(\nabla_{\theta} q_{\theta}(x)\right)^{2}}{2 q_{\theta}(x)} d x \\ &=(\Delta \theta)^{2} \cdot \int \frac{\left(\nabla_{\theta} q_{\theta}(x)\right)^{2}}{2 q_{\theta}(x)} d x \\ & \approx(\Delta \theta \cdot c)^{2} \end{aligned}

上式中应用了log(1+x)\log(1+x)的泰勒展开式以及求导和积分可互换、可积分的假设。上面的粗略估计表明,生成器的参数不能变化太大。而我们用的是基于梯度下降的优化算法,所以Δθ\Delta \theta正比于梯度,因此标准GAN训练时的很多trick,比如梯度裁剪、用Adam优化器、用BN,都可以解释得通了,它们都是为了稳定梯度,使得Δθ\Delta \theta不至于过大,同时,G(z)G(z)的迭代次数也不能过多,因为过多同样会导致Δθ\Delta \theta过大。

正则项

考虑如何添加正则项以改进GAN的稳定性:

直接对KL(q(x)qo(x))K L\left(q(x) \| q^{o}(x)\right)进行估算是很困难的,但是我们上面提到q(zx)q(z|x)qo(zx)q^o(z|x)是狄拉克分布,而狄拉克分布可以看作方差为0的高斯分布,于是考虑用KL(q(x,z)qo(x,z))K L\left(q(x,z) \| q^{o}(x,z)\right)进行估算:

KL(q(x,z)q~(x,z))=q(xz)q(z)logq(xz)q(z)q~(xz)q(z)dxdz=δ(xG(z))q(z)logδ(xG(z))δ(xGo(z))dxdz=q(z)logδ(0)δ(G(z)Go(z))dz\begin{aligned} K L(q(x, z) \| \tilde{q}(x, z)) &=\iint q(x | z) q(z) \log \frac{q(x | z) q(z)}{\tilde{q}(x | z) q(z)} d x d z \\ &=\iint \delta(x-G(z)) q(z) \log \frac{\delta(x-G(z))}{\delta\left(x-G^{o}(z)\right)} d x d z \\ &=\int q(z) \log \frac{\delta(0)}{\delta\left(G(z)-G^{o}(z)\right)} d z \end{aligned}

将狄拉克分布可以看作方差为0的高斯分布,并代入:

δ(x)=limσ01(2πσ2)d/2exp(x22σ2)\delta(x)=\lim _{\sigma \rightarrow 0} \frac{1}{\left(2 \pi \sigma^{2}\right)^{d / 2}} \exp \left(-\frac{x^{2}}{2 \sigma^{2}}\right)

KL(q(x,z)q~(x,z))=q(z)logδ(0)δ(G(z)Go(z))dz=limσ0q(x)log[1/exp((G(z)G0(z))22σ2)]dx=limσ0q(x)((G(z)G0(z))22σ2)dxλq(z)G(z)Go(z)2dz\begin{aligned} K L(q(x, z) \| \tilde{q}(x, z)) &=\int q(z) \log \frac{\delta(0)}{\delta\left(G(z)-G^{o}(z)\right)} d z \\ &= \lim _{\sigma \rightarrow 0} \int q(x) \log \left[ 1/{\exp \left(-\frac{(G(z)-G^0(z))^{2}}{2 \sigma^{2}}\right)} \right]dx \\ &= \lim _{\sigma \rightarrow 0} \int q(x) \left(-\frac{(G(z)-G^0(z))^{2}}{2 \sigma^{2}}\right)dx \\ & \sim \lambda \int q(z)\left\|G(z)-G^{o}(z)\right\|^{2} d z \end{aligned}

于是有

KL(q(x)qo(x))λq(z)G(z)Go(z)2dzK L\left(q(x) \| q^{o}(x)\right) \sim \lambda \int q(z)\left\|G(z)-G^{o}(z)\right\|^{2} d z

从而完整的生成器loss可以选择为

Ezq(z)[logD(G(z))+λG(z)Go(z)2]\mathbb{E}_{z \sim q(z)}\left[-\log D(G(z))+\lambda\left\|G(z)-G^{o}(z)\right\|^{2}\right]

实验结果

1581163282072.png

1581163339120.png

FLOW

基本思路:直接硬算积分式

zp(xz)p(z)dz\int_{z} p(x | z) p(z) d z

流模型有一个非常与众不同的特点是,它的转换通常是可逆的。也就是说,流模型不 仅能找到从 A 分布变化到 B 分布的网络通路,并且该通路也能让 B 变化到 A,简言之流模 型找到的是一条 A、B 分布间的双工通路。当然,这样的可逆性是具有代价的——A、B 的 数据维度必须是一致的。

A、B 分布间的转换并不是轻易能做到的,流模型为实现这一点经历了三个步骤:最初 的 NICE 实现了从 A 分布到高斯分布的可逆求解;后来 RealNVP 实现了从 A 分布到条件非 高斯分布的可逆求解;而最新的 GLOW,实现了从 A 分布到 B 分布的可逆求解,其中 B 分 布可以是与 A 分布同样复杂的分布,这意味着给定两堆图片,GLOW 能够实现这两堆图片 间的任意转换。

NICE

两个一维分布之间的转化参考前言中的栗子,下面考虑高维分布:

image.png

类似一维分布,两个分布在映射前后的相同区域应该有相同的概率。

p(x)det(Jf)=π(z)p\left(x^{\prime}\right)\left|\operatorname{det}\left(J_{f}\right)\right|=\pi\left(z^{\prime}\right)

其中JfJ_f为雅可比行列式,函数ffzz上的分布变换到xx上的分布。

根据雅可比行列式的逆运算,同样有:

p(x)=π(z)det(Jf1)p\left(x^{\prime}\right)=\pi\left(z^{\prime}\right)\left|\operatorname{det}\left(J_{f^{-1}}\right)\right|

至此,我们得到了一个比较重要的结论:如果 zzxx 分别满足两种分布,并且 zz 通过 函数 ff 能够转变为 xx,那么 zzxx 中的任意一组对应采样点 𝑧𝑧′𝑥𝑥′ 之间的关系为:

{π(z)=p(x)det(Jf)p(x)=π(z)det(Jf1)\left\{\begin{array}{c} {\pi\left(z^{\prime}\right)=p\left(x^{\prime}\right)\left|\operatorname{det}\left(J_{f}\right)\right|} \\ {p\left(x^{\prime}\right)=\pi\left(z^{\prime}\right)\left|\operatorname{det}\left(J_{f^{-1}}\right)\right|} \end{array}\right.

从这个公式引入了Flow_based_model 的基本思路:设计一个神经网络,将分布 xx 映射到分布 zz ,具体来说,流模型选择 q(z)q(z) 为高斯分布,q(xz)q(x|z) 为狄拉克分布 δ(xg(z)\delta(x-g(z) ,其中gg 是可逆的:

x=g(z)z=f(x)x=g(z) \Leftrightarrow z=f(x)

要从理论上实现可逆,需要 xxzz 的维数相同,将 zz 的分布代入,则有:

q(z)=1(2π)D/2exp(12z2)q(z)=\frac{1}{(2 \pi)^{D / 2}} \exp \left(-\frac{1}{2}\|z\|^{2}\right)

q(x)=1(2π)D/2exp(12f(x)2)det[fx](2)q(\boldsymbol{x})=\frac{1}{(2 \pi)^{D / 2}} \exp \left(-\frac{1}{2}\|\boldsymbol{f}(\boldsymbol{x})\|^{2}\right)\left|\operatorname{det}\left[\frac{\partial \boldsymbol{f}}{\partial \boldsymbol{x}}\right]\right|\tag{2}

公式(2)(2)ff 提出了三个基本要求:

  • 可逆,且逆函数容易计算。
  • 对应的雅可比行列式方便计算
  • 拟合能力强

这样的话,就有

logq(x)=D2log(2π)12f(x)2+logdet[fx]\log q(x)=-\frac{D}{2} \log (2 \pi)-\frac{1}{2}\|f(x)\|^{2}+\log \left|\operatorname{det}\left[\frac{\partial f}{\partial x}\right]\right|

这个优化目标是可计算的,并且因为 ff 可逆,那么我们在zz 中取样,就可以生成相应的 xx

x=f1(z)=g(z)x=f^{-1}(z)=g(z)

为了满足这三个条件,NICE和REAL NVP、GLOW都采用了模块化思想,将 ff 设计成一组函数的复合,其中每个函数都满足要求一和要求二,经过复合之后函数也容易满足要求三。

f=fLf2f1f=f_{L} \circ \ldots \circ f_{2} \circ f_{1}

相对而言,雅可比行列式的计算要比函数求逆更加复杂,考虑第二个要求,我们知道三角行列式最容易计算,所以我们要想办法让变换 ff 的雅可比矩阵为三角阵。NICE的做法是:将 DDxx 分为两部分 x1,x2x_1,x_2,然后取下述变换:

h1=x1h2=x2+m(x1)\begin{array}{l} {\boldsymbol{h}_{1}=\boldsymbol{x}_{1}} \\ {\boldsymbol{h}_{2}=\boldsymbol{x}_{2}+\boldsymbol{m}\left(\boldsymbol{x}_{1}\right)} \end{array}

其中 mm 为任意函数,这个变换称为“加性耦合层” ,这个变换的雅可比矩阵 [hx][\frac{\partial h}{\partial x}] 是一个三角阵,且对角线元素全部为1,用分块矩阵表示为:

[hx]=(IdOmx1IDd)\left[\frac{\partial \boldsymbol{h}}{\partial \boldsymbol{x}}\right]=\left(\begin{array}{cc} {\mathrm{I}_{d}} & {\mathrm{O}} \\ \frac{\partial m}{\partial x_1} & I_{D-d} \end{array}\right)

同时这个变换也是可逆的,其逆变换为

x1=xhx2=h2m(h1)\begin{array}{l} {\boldsymbol{x}_{1}=\boldsymbol{x}_{h}} \\ {\boldsymbol{x}_{2}=\boldsymbol{h}_{2}-\boldsymbol{m}\left(\boldsymbol{h}_{1}\right)} \end{array}

满足了要求一和要求二,同时这个雅可比行列式的值为1,行列式的值的物理含义是体积,所以这个变换暗含了变换前后的体积不变性。我们注意到:该变换的第一部分是平凡的(恒等变换),因此需要对调I1和I2两组维度,再输入加和耦合层,并将这个过程重复若干次, 以达到信息充分混合的目的,如图:

image.png

因为该变换需要满足 zzxx 的维度相同,这会产生很严重的唯独浪费问题,NICE在最后一层里引入了一个尺度变换对维度进行缩放:

z=sh(n)z=s \otimes h^{(n)}

其中s=(s1,s2,...,sD)s=(s_1,s_2,...,s_D)也是一个要优化的参数向量,这个 ss 向量能够识别每个维度的重要程度, ss 越小,这个维度越不重要,起到压缩流形的作用。这个尺度变换层的雅可比行列式就不是一了,而是:

[zh(n)]=diag(s)\left[\frac{\partial z}{\partial \boldsymbol{h}^{(n)}}\right]=\operatorname{diag}(\boldsymbol{s})

他的行列式的值为 isi\prod_{i} s_{i},于是最后的对数似然为:

logq(x)12sf(x)2+ilogsi\log q(\boldsymbol{x}) \sim-\frac{1}{2}\|\boldsymbol{s} \otimes \boldsymbol{f}(\boldsymbol{x})\|^{2}+\sum_{i} \log \boldsymbol{s}_{i}

这个尺度变换实际上是将先验分布 q(z)q(z) 的方差也作为训练参数,方差越小,说明这个维度的“弥散”越小,若方差为0,这一维的特征就恒为均值,于是流行减小一维。

我们写出带方差的正态分布:

q(z)=1(2π)D/2i=1Dσiexp(12i=1Dzi2σi2)q(z)=\frac{1}{(2 \pi)^{D / 2} \prod_{i=1}^{D} \sigma_{i}} \exp \left(-\frac{1}{2} \sum_{i=1}^{D} \frac{z_{i}^{2}}{\sigma_{i}^{2}}\right)

z=f(x)z=f(x) 代入,并取对数,类似得:

logq(x)12i=1Dfi2(x)σi2i=1Dlogσi\log q(\boldsymbol{x}) \sim-\frac{1}{2} \sum_{i=1}^{D} \frac{\boldsymbol{f}_{i}^{2}(\boldsymbol{x})}{\boldsymbol{\sigma}_{i}^{2}}-\sum_{i=1}^{D} \log \boldsymbol{\sigma}_{i}

与之前那个公式对比,就有 si=1/σis_i=1/\sigma_i ,所以尺度变换层等价于将先验分布的方差作为训练参数,若方差足够小,则维度减一,暗含了降维的可能。

REALNVP

NICE构思巧妙,但在实验部分只是采取了简单的加性耦合层和将全连接层进行简单的堆叠,并没有使用卷积。REALNVP一般化了耦合层,并在耦合模型中引入了卷积层,使得模型可以更好地处理图像问题。论文里还引入了一个多尺度结构来处理维度浪费问题。

将加性耦合层换成仿射耦合层:

h1=x1h2=s(x1)x2+t(x1)(x1)\begin{array}{l} {\boldsymbol{h}_{1}=\boldsymbol{x}_{1}} \\ {\boldsymbol{h}_{2}=\boldsymbol{s}\left(\boldsymbol{x}_{1}\right) \otimes \boldsymbol{x}_{2}+t\left(\boldsymbol{x}_{1}\right)\left(\boldsymbol{x}_{1}\right)} \end{array}

仿射耦合层的雅可比行列式仍然是一个对角阵

[hx]=(IdO[mx1]s)\left[\frac{\partial \boldsymbol{h}}{\partial \boldsymbol{x}}\right]=\left(\begin{array}{cc} {\mathbb{I}_{d}} & {\mathbb{O}} \\ {\left[\frac{\partial m}{\partial x_{1}}\right]} & {s} \end{array}\right)

雅可比行列式的值不再是1,没有保持变换前后的体积不变。

在NICE中,通过交错的方式来混合信息流(直接反转原来的向量),在REALNVP中发现:随机打乱维度可以使信息混合的更加充分。

image.png

image.png

引入卷积层:使用卷积的条件是具有局部相关性,因此指定向量的打乱和重排都是在channel维度上进行,在height和width维度上进行卷积。对通道的分割论文里还提出棋盘式分割的策略,但较为复杂,对模型的提升也不大,因此在GLOW中被舍弃了。

一般的图像通道数只有三层,MNIST等灰度图只有一层,因此REALNVP引入了squeeze操作来增加通道数。

其思想很简单:直接 reshape,但 reshape 时局部地进行。具体来说,假设原来图像为 h×w×c 大小,前两个轴是空间维度,然后沿着空间维度分为一个个 2×2×c 的块( 2 可以自定义),然后将每个块直接 reshape 为 1×1×4c,最后变成了 h/2×w/2×4c。

image.png

REALNVP中还引入了一个多尺度结构:

image.png

最终的输出 z1,z3,z5z_1,z_3,z_5 怎么取?

p(z1,z3,z5)=p(z1z3,z5)p(z3z5)p(z5)p\left(z_{1}, z_{3}, z_{5}\right)=p\left(z_{1} | z_{3}, z_{5}\right) p\left(z_{3} | z_{5}\right) p\left(z_{5}\right)

由于 z3,z5z_3,z_5 是由 z2z_2 完全决定的,z5z_5 也是由 z4z_4 完全决定的,因此条件部分可以改为:

p(z1,z3,z5)=p(z1z2)p(z3z4)p(z5)p\left(z_{1}, z_{3}, z_{5}\right)=p\left(z_{1} | z_{2}\right) p\left(z_{3} | z_{4}\right) p\left(z_{5}\right)

RealNVP 和 Glow 假设右端三个概率分布都是正态分布,类似VAE, p(z1z2)p(z_1|z_2) 的均值方差由 z2z_2 算出来,p(z3z4)p(z_3|z_4) 的均值方差由 z4z_4 算出来,p(z5)p(z_5) 的均值方差直接学习出来。这相当于做了变量代换:

z^1=z1μ(z2)σ(z2),z^3=z3μ(z4)σ(z4),z^5=z5μσ\hat{z}_{1}=\frac{z_{1}-\mu\left(z_{2}\right)}{\sigma\left(z_{2}\right)}, \quad \hat{z}_{3}=\frac{z_{3}-\mu\left(z_{4}\right)}{\sigma\left(z_{4}\right)}, \quad \hat{z}_{5}=\frac{z_{5}-\mu}{\sigma}

然后认为 [z^1,z^3,z^5][\hat{z}_1,\hat{z}_3,\hat{z}_5]服从标准正态分布。类似NICE,这三个变换会导致一个非1的雅可比行列式,也就是往loss中加入 Σi=1Dlogσi\Sigma_{i=1}^{D} \log \sigma_{i} 这一项。

多尺度结构相当于抛弃了 p(z)p(z) 是标准正态分布的直接假设,而采用了一个组合式的条件分布,这样尽管输入输出的总维度依然一样,但是不同层次的输出地位已经不对等了,模型可以通过控制每个条件分布的方差来抑制维度浪费问题(极端情况下,方差为 0,那么高斯分布坍缩为狄拉克分布,维度就降低 1),条件分布相比于独立分布具有更大的灵活性。而如果单纯从 loss 的角度看,多尺度结构为模型提供了一个强有力的正则项。

GLOW

效果好的令人惊叹的生成模型:

改变图像属性

采样展示

潜在空间的插值

总体来说,GLOW引入1*1可逆卷积来代替通道维度的打乱和重排操作,并对 REALNVP 的原始模型做了简化和规范。

向量之间的元素置换操作可以用简单的行变换矩阵来操作:

(badc)=(0100100000010010)(abcd)\left(\begin{array}{l} {b} \\ {a} \\ {d} \\ {c} \end{array}\right)=\left(\begin{array}{llll} {0} & {1} & {0} & {0} \\ {1} & {0} & {0} & {0} \\ {0} & {0} & {0} & {1} \\ {0} & {0} & {1} & {0} \end{array}\right)\left(\begin{array}{l} {a} \\ {b} \\ {c} \\ {d} \end{array}\right)

GLOW中用一个更一般的矩阵 WW 来代替这个置换矩阵

h=xWh=xW

这个变换的雅可比矩阵就是det(W)det(W),因此需要将 logdet(W)-log|det(W)| 加入到loss中,WW 的初始选择要求可逆,不引入loss,因此选为随即正交阵。

这个变换引入了 det(W)det(W) 的计算问题,GLOW中逆用LU分解克服了这个问题,若 W=PLUW=PLU (其中P是一个置换矩阵),则

logdetW=logdiag(U)\log |\operatorname{det} W|=\sum \log |\operatorname{diag}(U)|

这就是GLOW中给出的技巧:先随机生成一个正交矩阵,然后做 LULU 分解,得到 P,L,UP,L,U,固定 P,也固定 U 的对角线的正负号,然后约束 L 为对角线全 1 的下三角阵,U 为上三角阵,优化训练 L,U 的其余参数。

也可以理解为:在NICE和REALNVP中都是通过交换、打乱、重排等操作混合各个通道的信息,但通道信息的混合可直接通过1*1卷积实现。

整个GLOW模型如下:

image.png

对比

比较反转、打乱和1*1逆卷积的loss:

image.png

缺点

模型庞大,参数量极大,NICE模型在MNIST数据集上的训练参数就大概有两千万个。

再贴两个Glow模型在Gayhub Github上的issue感受下:

image.png

256*256的高清人脸生成,用一块GPU训练的话,大概要一年……

一图对比GAN,VAE和FLOW

1581163587153

参考文献